#!/bin/bash

# FTP客户端测试脚本
echo "🧪 FTP客户端测试脚本"
echo "===================="

# 设置颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 函数：打印成功消息
print_success() {
    echo -e "${GREEN}✅ $1${NC}"
}

# 函数：打印错误消息
print_error() {
    echo -e "${RED}❌ $1${NC}"
}

# 函数：打印警告消息
print_warning() {
    echo -e "${YELLOW}⚠️ $1${NC}"
}

# 函数：打印信息消息
print_info() {
    echo -e "${YELLOW}ℹ️ $1${NC}"
}

# 检查Rust是否安装
check_rust() {
    print_info "检查Rust环境..."
    if command -v cargo &> /dev/null; then
        print_success "Rust环境正常"
        cargo --version
    else
        print_error "Rust未安装，请先安装Rust"
        exit 1
    fi
}

# 构建客户端
build_client() {
    print_info "构建FTP客户端..."
    if cargo build -p ftp-client; then
        print_success "客户端构建成功"
    else
        print_error "客户端构建失败"
        exit 1
    fi
}

# 测试客户端连接
test_client_connection() {
    print_info "测试客户端连接..."
    
    # 测试连接到不存在的服务器（应该失败）
    print_info "测试连接到不存在的服务器..."
    if cargo run -p ftp-client -- --host 127.0.0.1 --port 9999 2>&1 | grep -q "Failed to connect"; then
        print_success "连接失败测试通过"
    else
        print_warning "连接失败测试可能有问题"
    fi
    
    # 测试连接到FTP服务器（如果运行）
    print_info "测试连接到FTP服务器..."
    if cargo run -p ftp-client -- --host 127.0.0.1 --port 21 2>&1 | grep -q "Connected to"; then
        print_success "连接成功测试通过"
    else
        print_warning "FTP服务器可能未运行"
    fi
}

# 测试客户端认证
test_client_auth() {
    print_info "测试客户端认证..."
    
    # 测试无效认证
    print_info "测试无效认证..."
    if cargo run -p ftp-client -- --host 127.0.0.1 --port 21 --username invalid --password wrong 2>&1 | grep -q "Login failed"; then
        print_success "无效认证测试通过"
    else
        print_warning "无效认证测试可能有问题"
    fi
    
    # 测试有效认证（如果服务器运行且有测试用户）
    print_info "测试有效认证..."
    if cargo run -p ftp-client -- --host 127.0.0.1 --port 21 --username testuser --password testpass 2>&1 | grep -q "Logged in"; then
        print_success "有效认证测试通过"
    else
        print_warning "有效认证测试失败（可能需要先启动服务器和创建用户）"
    fi
}

# 测试交互模式
test_interactive_mode() {
    print_info "测试交互模式..."
    
    # 创建测试输入文件
    echo -e "pwd\nls\ncd /\npasv\ntype A\nquit" > test_input.txt
    
    # 运行交互模式测试
    if timeout 10 cargo run -p ftp-client -- --host 127.0.0.1 --port 21 --username testuser --password testpass --interactive < test_input.txt 2>&1 | grep -q "FTP Client Commands"; then
        print_success "交互模式测试通过"
    else
        print_warning "交互模式测试失败"
    fi
    
    # 清理测试文件
    rm -f test_input.txt
}

# 运行完整测试
run_full_test() {
    print_info "开始FTP客户端完整测试"
    
    check_rust
    build_client
    test_client_connection
    test_client_auth
    test_interactive_mode
    
    print_success "所有测试完成！"
}

# 显示帮助信息
show_help() {
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  build      - 构建客户端"
    echo "  connection - 测试连接"
    echo "  auth       - 测试认证"
    echo "  interactive - 测试交互模式"
    echo "  test       - 运行所有测试"
    echo "  help       - 显示此帮助信息"
    echo ""
    echo "示例:"
    echo "  $0 build      # 构建客户端"
    echo "  $0 test       # 运行所有测试"
}

# 主函数
main() {
    case "${1:-test}" in
        "build")
            check_rust
            build_client
            ;;
        "connection")
            check_rust
            test_client_connection
            ;;
        "auth")
            check_rust
            test_client_auth
            ;;
        "interactive")
            check_rust
            test_interactive_mode
            ;;
        "test")
            run_full_test
            ;;
        "help"|"-h"|"--help")
            show_help
            ;;
        *)
            print_error "未知选项: $1"
            show_help
            exit 1
            ;;
    esac
}

# 运行主函数
main "$@"
